/**
 * Copyright (C), 2010-2012, TIETIAO Software Co.,Ltd. ALL RIGHTS RESERVED.
 * 
 * 文件描述: 系统公用的JS文件。
 * 
 * Notes:
 * 
 */
Ext.namespace('com.tietiao');
Ext.namespace('dhcc.sms');

Ext.BLANK_IMAGE_URL = './js/ext3.3/resources/images/default/s.gif';

/**
 * 根据Id获取页面html标签对象
 * 
 * @param {String}
 *            idStr 要获取的DOM对象的ID
 * @return {DOM} ID对应的DOM对象
 */
function $(idStr) {
	return document.getElementById(idStr);
}

/**
 * 外部文件类型 MODEL_TYPE 模版类型 PARAM_TYPE 参数类型
 */
com.tietiao.LoadFileType = {
	CSS_TYPE : 1,
	JS_TYPE : 2
};

/**
 * 动态加载CSS与JS文件
 * 
 * @param {String}
 *            filename : 加载文件的URL路径
 * @param {int}
 *            filetype : 加载文件的类型
 */
com.tietiao.DynamicLoadFile = function(filename, filetype) {
	// 如果已经加载过则不再加载
	if (com.tietiao.IsLoanedFile(filename, filetype)) {
		return;
	}

	if (filetype == com.tietiao.LoadFileType.JS_TYPE) {
		var fileref = document.createElement('script');
		fileref.setAttribute("type", "text/javascript");
		fileref.setAttribute("src", filename);
	} else if (filetype == com.tietiao.LoadFileType.CSS_TYPE) {
		var fileref = document.createElement("link");
		fileref.setAttribute("rel", "stylesheet");
		fileref.setAttribute("type", "text/css");
		fileref.setAttribute("href", filename);
	}
	if (typeof fileref != "undefined")
		document.getElementsByTagName("head")[0].appendChild(fileref);
};

/**
 * 判断是否已经加载CSS与JS文件
 * 
 * @param {String}
 *            filename : 加载文件的URL路径
 * @param {int}
 *            filetype : 加载文件的类型
 */
com.tietiao.IsLoanedFile = function(filename, filetype) {
	var i;
	var isLoaned = false;
	if (filetype == com.tietiao.LoadFileType.JS_TYPE) {
		var scriptfiles = document.getElementsByTagName("script");
		for (i = 0; i < scriptfiles.length; i++) {
			if (scriptfiles[i].src
					&& scriptfiles[i].src.indexOf(filename) != -1) {
				if (scriptfiles[i].readyState == "loaded"
						|| scriptfiles[i].readyState == "complete") {
					isLoaned = true;
					break;
				}
			}
		}
	}
	if (filetype == com.tietiao.LoadFileType.CSS_TYPE) {
		var cssfiles = document.getElementsByTagName("link");
		for (i = 0; i < cssfiles.length; i++) {
			if (cssfiles[i].href && cssfiles[i].href.indexOf(filename) != -1) {
				if (cssfiles[i].readyState == "loaded"
						|| cssfiles[i].readyState == "complete"
						|| cssfiles[i].readyState == "interactive") {
					isLoaned = true;
					break;
				}
			}
		}
	}

	return isLoaned;
};

/**
 * 公共的提示功能。
 * 
 * @param {String}
 *            msg 提示的消息字符串
 * @param {String}
 *            id 用于定位的元素的id，可以为空，如果为空， 则默认为alignPoint（如果页面中存在的话）。
 */
com.tietiao.messagebox = {
	warning : function(msg, id) {
		var win = Ext.MessageBox;
		var alignPointId = 'alignPoint';
		if (id != undefined || $(alignPointId)) {
			win.getDialog().on({
						show : function(dlg) {
							dlg.alignTo(id ? id : alignPointId, 't-b');
						}
					});
		}

		win.show({
					title : '提示',
					msg : msg,
					buttons : Ext.MessageBox.OK,
					icon : Ext.MessageBox.WARNING
				});
	},

	error : function(msg, id) {
		var win = Ext.MessageBox;
		var alignPointId = 'alignPoint';
		if (id != undefined || $(alignPointId)) {
			win.getDialog().on({
						show : function(dlg) {
							dlg.alignTo(id ? id : alignPointId, 't-b');
						}
					});
		}

		win.show({
					title : '提示',
					msg : msg,
					buttons : Ext.MessageBox.OK,
					icon : Ext.MessageBox.ERROR
				});
	},

	info : function(msg, id) {
		var win = Ext.MessageBox;
		var alignPointId = 'alignPoint';
		if (id != undefined || $(alignPointId)) {
			win.getDialog().on({
						show : function(dlg) {
							dlg.alignTo(id ? id : alignPointId, 't-b');
						}
					});
		}

		win.show({
					title : '提示',
					msg : msg,
					buttons : Ext.MessageBox.OK,
					icon : Ext.MessageBox.INFO
				});
	}
};

/**
 * 打开进度条窗口。
 * 
 * @param {String}
 *            msg 提示的消息字符串，可以为空
 * @param {String}
 *            id 用于定位的元素的id，可以为空，如果为空， 则默认为alignPoint（如果页面中存在的话）。
 */
com.tietiao.progress = function(msg, id) {
	var win = Ext.MessageBox;
	var alignPointId = 'alignPoint';
	if (id != undefined || $(alignPointId)) {
		win.getDialog().on({
					show : function(dlg) {
						dlg.alignTo(id ? id : alignPointId, 't-b');
					}
				});
	}

	win.show({
				msg : msg ? msg : '正在处理中，请稍等...',
				progressText : '处理中...',
				width : 300,
				wait : true
			});
};


com.tietiao.Validator = {

	/**
	 * 验证是否是URL
	 * 
	 * @param {String}
	 *            value 要验证的字符串
	 * @return {boolean} 是返回true 否则fasle
	 */
	validateUrl : function(value) {
		var urlRegexp = new RegExp('[a-zA-z]+[^s]*');
		return urlRegexp.test(value);
	},

	/**
	 * 验证是否是非空白字符窜
	 * 
	 * @param {String}
	 *            value 要验证的字符串
	 * @return {boolean} 是返回true 否则fasle
	 */
	isEmptyStr : function(value) {
		return /^\s*$/g.test(value);
	},

	/**
	 * 验证是否是Ip
	 * 
	 * @param {String}
	 *            value 要验证的字符串
	 * @return {boolean} 是返回true 否则fasle
	 */
	validateIp : function(value) {
		var pattern = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
		return pattern.test(value);
	},

	/**
	 * 验证是否是正整数
	 * 
	 * @param {String}
	 *            value 要验证的数字
	 * @return {boolean} 是返回true 否则fasle
	 */
	isPositiveInteger : function(value) {
		return /^\d+$/.test(value);
	},

	/**
	 * 验证是否是email
	 * 
	 * @param {String}
	 *            value 字符串
	 * @return {boolean} 是返回true 否则fasle
	 */
	isEmail : function(value) {
		var pattern = /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
		return pattern.test(value);
	},
	/**
	 * 验证给定的obj是否为null或者为undefined
	 * @param {} obj
	 */
	isNotNullOrUndefined : function(obj) {
		if(obj == null || typeof(obj) == 'undefined') {
			return false;
		}
		return true;
	},
	/**
	 * 判断给定的字符是否为字母或数字组成
	 * @param {} str
	 * 
	 * @return 'undifined' 给定的字符为null或者undifined 
	 *           true 符合条件
	 *           false 不符合条件 
	 */
	isLetterOrNum : function(str) {
		if(isNotNullOrUndefined(str)) {
			var reg = /^[0-9a-zA-Z]+$/g;
			return reg.test(str);
		}
		return 'undifined';
	},
	/**
	 * 判断字符由字母或数字，下划线，点号组成，且开头只能是下划线和字母
	 * @param {} str
	 * 
	 * @return 'undifined' 给定的字符为null或者undifined 
	 *           true 符合条件
	 *           false 不符合条件 
	 */
	isLegalityName : function(str) {
		if(isNotNullOrUndefined(str)) {
			var reg = /^(a-zA-Z_{1})([A-Za-z0-9_\.])$/g;
			return reg.test(str);
		}
		return 'undifined';
	}
};

/**
 * 字符串替换方法
 * 
 * @param {String}
 *            findText 原字符
 * @param {String}
 *            replaceText 用来替换的字符
 * @return {String} 替换后的字符串
 */
String.prototype.replaceAll = function strReplace(findText, replaceText) {
	var str = new String(this);
	while (str.indexOf(findText) != -1) {
		str = str.replace(findText, replaceText);
	}
	return str;
};



/**
 * 替换面板内容 url: 目标地址 par: 访问参数 renderId: 面板ID
 */
com.tietiao.refreshDiv = function(url, pars, renderId) {
	Ext.Ajax.request({
				url : encodeURI(url),
				params : pars,
				success : function(resp, option) {
					Ext.get(renderId).dom.innerHTML = resp.responseText;
				},
				failure : function(resp, option) {
				}
			});
};

/**
 * 当鼠标点击文本框时如果文本框中的字符串是默认字符串时清空文本框
 * 
 * @param obj
 *            文本框对象
 * @param text
 *            默认字符串
 * @return
 */
function clearText(obj, text) {
	if (obj.value == text) {
		obj.value = '';
	}
};

/**
 * 当鼠标点击非文本框区域时如果文本框中的字符串是空时在文本框中填入默认字符串
 * 
 * @param obj
 *            文本框对象
 * @param text
 *            默认字符串
 * @return
 */
function showText(obj, text) {
	if (obj.value == '') {
		obj.value = text;
	}
};

function deleteZero(str) {
	var index = 0;
	for (var i = 0; i < str.length; i++) {
		if (parseInt(str.charAt(i)) != 0) {
			index = i;
			break;
		}
	}
	return str.substring(index, str.length);
}

/**
 * 在新的窗口打开一个页面
 * 
 * @return 打开新页面
 */
com.tietiao.openNewWin = function(url, width, height) {
	var paramStr = '';
	if (width != null && height != null) {
		paramStr = 'width=' + width + ',height=' + height + ',';
	}
	paramStr += 'center=1,status=no,location=0,top=264,left=264,top=254,resizable=no';

	var title = 'new';
	window.open(url, title, paramStr);
};

/**
 * 时间格式转换（将时：分：秒 的格式换成秒数 ）
 * 
 * @param {String}
 *            value 时：分：秒
 * @return {Number} 秒数
 */
com.tietiao.timeFormater = function(value) {
	var time = value.split(':');
	var hour = time[0];
	var minute = time[1];
	var second = time[2];

	var hourFmt = parseInt(hour) * 3600;
	var minuteFmt = parseInt(minute) * 60;
	var timeFmt = hourFmt + minuteFmt + parseInt(second);
	return timeFmt;
};

/**
 * 在当前页面中中新弹出一个窗口(窗口内容为一个或多个Ext组件)
 * 
 * @param {Object/Array}
 *            items Ext组件可以是一个组件，也可以是组件数组 object/Array
 * @param {String}
 *            winId Ext窗口组件ID
 * @param {String}
 *            title 窗口标题 如果为空 默认为'详细信息'
 * @param {Number}
 *            width Ext 窗口宽度 默认为 300
 * @param {Number}heigth
 *            Ext 窗口高度 默认为 400
 * @param {String/Object}
 *            layout Ext窗口内容布局 默认为自动布局
 * 
 * @param window组件对象
 */
com.tietiao.showWin = function(items, winId, title, width, heigth, layout) {
	var dWinId = com.tietiao.getValue(winId, 'showWinId');
	var dWidth = com.tietiao.getValue(width, 300);
	var dHeigth = com.tietiao.getValue(heigth, 400);
	var dTitle = com.tietiao.getValue(title, '详细信息');
	var dLayout = com.tietiao.getValue(layout, 'auto');
	var win = new Ext.Window({
				id : dWinId,
				width : dWidth,
				height : dHeigth,
				autoHeight : true, // 2011-07-11 add by hq
				title : dTitle,
				layout : dLayout,
				items : items,
				modal : true,
				closeAction : 'close'
			});
	win.show();

	return win;
};

/**
 * 在当前页面中中新弹出一个窗口(窗口内容为新的页面)
 * 
 * @param {String}
 *            url 访问的URL路径
 * @param {Object}
 *            params 所需要传递的参数 格式如下{id:20,name:'test'}
 * @param {String}
 *            winId Ext窗口组件ID
 * @param {String}
 *            title 窗口标题 如果为空 默认为'详细信息'
 * @param {Number}
 *            width Ext 窗口宽度 默认为 300
 * @param {Number}heigth
 *            Ext 窗口高度 默认为 400
 * @param {String/Object}
 *            layout Ext窗口内容布局 默认为自动布局
 * 
 * @param window组件对象
 */
com.tietiao.showHtmlWin = function(url, params, winId, title, width, heigth,
		layout) {

	var dWinId = com.tietiao.getValue(winId, 'showWinId');
	var dWidth = com.tietiao.getValue(width, 300);
	var dHeigth = com.tietiao.getValue(heigth, 400);
	var dTitle = com.tietiao.getValue(title, '详细信息');
	var dLayout = com.tietiao.getValue(layout, 'auto');

	var win = new Ext.Window({
				id : dWinId,
				width : dWidth,
				height : dHeigth,
				title : dTitle,
				layout : dLayout,
				closeAction : 'close',
				modal : true,
				autoLoad : {
					url : url,
					params : params,
					text : 'loading',
					timeout : 60,
					scripts : true,
					nocache : true
				}
			});

	win.show();
	return win;
};
/**
 * 在当前页面中中新弹出一个窗口
 * 
 * @param {object}
 *            config window的配置
 * 
 * @return win
 */
com.tietiao.showWinByConfig = function(config) {
	var defaultConfig = {
		id : 'showwinId',
		width : 300,
		height : 400,
		title : '详细信息',
		layout : 'auto',
		modal : true,
		closeAction : 'close'
	};
	var win = new Ext.Window(Ext.apply(defaultConfig, config));
	win.show();
	return win;
};

/**
 * 获取value值，如果value为空,则返回默认值 defaultValue
 * 
 * @param {String}
 *            value
 * @param (String)
 *            defaultValue
 * 
 * @return 如果value为空,则返回默认值defaultValue
 */
com.tietiao.getValue = function(value, defaultValue) {
	if (value != undefined && !com.tietiao.Validator.isNullStr(value)) {
		return value;
	}
	return defaultValue;
};

/**
 * @class com.tietiao.comboxCreator
 * 
 * 用于创建各种系统中通用的ComboBox组件。
 */
com.tietiao.comboxCreator = {
	/**
	 * 创建系统编码Combox
	 * 
	 * @param {Number}
	 *            parentCode 父编码ID 传入com.tietiao.SyscodeType对象中的值
	 * @param {Object}
	 *            config ComboBox的配置信息
	 * @return { Ext.form.ComboBox} 生成的ComboBox对象
	 */
	createSysCodeComobx : function(parentCode, config) {
		if (parentCode == undefined || Ext.isEmpty(parentCode)) {
			com.tietiao.warning('parentCode 不能为空！');
			return;
		}

		var store = new Ext.data.JsonStore({
					url : './dic_dic_loadSysCode.action',
					root : 'root',
					fields : [{
								name : 'sysCode',
								mapping : 'sysCode'
							}, {
								name : 'sysName',
								mapping : 'sysName'
							}]
				});

		store.on('beforeload', function(store, options) {
					// 获取页面中查询条件的参数
					options.params = Ext.apply(options.params, {
								parentCode : parentCode
							});
				});

		var defaultConfig = {
			// id : 'sysCodeJs',
			store : store,
			mode : 'remote',
			editable : false,
			selectOnFocus : true,
			onSelectFocus : true,
			triggerAction : 'all',
			typeAhead : true,
			maxHeight : 160,
			width : 120,
			listWidth : 120,
			resizable : true,
			valueField : 'sysCode',
			displayField : 'sysName'
		};

		var sysCodeComboBox = new Ext.form.ComboBox(Ext.apply(defaultConfig,
				config));

		return sysCodeComboBox;
	}
};

/**
 * 获取下拉框中被选中的值
 * 
 * @param {String}
 *            selectId 下拉框ID
 */
com.tietiao.getSelectValue = function(selectId) {
	var selectObject = Ext.getDom(selectId);
	return selectObject.options[selectObject.selectedIndex].value;
};

/**
 * 获取radion中选中的值
 * 
 * @param (String)
 *            radioName radio名称
 */
com.tietiao.getRadioValue = function(radioName) {
	var radios = document.getElementsByName(radioName);
	for (var i = 0; i < radios.length; i++) {
		if (radios[i].checked) {
			return radios[i].value;
		}
	}
};

/**
 * 获取复选框中选中的值
 * 
 * @param (String)
 *            checkBoxName 复选框名称
 * @return 返回复选框中选中的值，多值以逗号相隔
 */
com.tietiao.getCheckBoxValue = function(checkBoxName) {

	var value = '';
	var checkBoxs = document.getElementsByName(checkBoxName);

	for (var i = 0; i < checkBoxs.length; i++) {
		if (checkBoxs[i].checked) {
			value += checkBoxs[i].value;
			value += ',';
		}
	}
	if (value.length > 0) {
		value = value.substring(0, value.length - 1);
	}
	return value;
};

/*
 * 描述：跨浏览器的设置 innerHTML 方法 允许插入的 HTML 代码中包含 script 和 style 作者：kenxu
 * <ken@ajaxwing.com> 日期：2006-03-23 参数： el: 合法的 DOM 树中的节点 htmlCode: 合法的 HTML 代码
 * 经测试的浏览器：ie5+, firefox1.5+, opera8.5+
 */
com.tietiao.setInnerHTML = function(el, htmlCode) {
	var ua = navigator.userAgent.toLowerCase();
	if (ua.indexOf('msie') >= 0 && ua.indexOf('opera') < 0) {
		htmlCode = '<div style="display:none">for IE</div>' + htmlCode;
		htmlCode = htmlCode.replace(/<script([^>]*)>/gi, '<script$1 defer>');
		el.innerHTML = htmlCode;
		el.removeChild(el.firstChild);
	} else {
		var el_next = el.nextSibling;
		var el_parent = el.parentNode;
		el_parent.removeChild(el);
		el.innerHTML = htmlCode;
		if (el_next) {
			el_parent.insertBefore(el, el_next);
		} else {
			el_parent.appendChild(el);
		}
	}
};

// 创建Tab标签页
com.tietiao.addTab = function(id, title, url) {
	var newId = 'tab_' + id;
	// 判断Tab标签页是否已经打开
	var tabPanel = parent.Ext.getCmp("masterPanel");
	var tab = tabPanel.getItem(newId);
	if (tab) {
		tabPanel.setActiveTab(tab);
		return;
	}
	var newTab = tabPanel.add({
				id : id,
				title : title,
				layout : 'fit',
				closable : true,
				html : "<iframe width='100%' height='100%' scrolling='auto' "
						+ "frameborder='0' src='" + url + "'></iframe>"
			});
	tabPanel.setActiveTab(newTab);
};


/**
 * 拼接URL和参数
 * 
 * @param {String}
 *            url 给定的URL
 * @param {Object}
 *            param 给定的参数对象
 */
com.tietiao.mergeUrlParam = function(url, param) {
	var i = 0;
	for (var props in param) {
		if (i == 0) {
			if (url.indexOf("?") <= 0) {
				url = url + "?" + props + "=" + param[props];
			} else {
				url = url + "&" + props + "=" + param[props];
			}

		} else {
			url = url + "&" + props + "=" + param[props];
		}
		i++;
	}
	return url;

};
/**
 * 获取选中的Grid数据（ID）
 * @param {} selModel EXT选择组件
 * @param {} idColumn grid 列标识
 */
com.tietiao.getSelectedGridValue = function(selModel,idColumn) {
	var sels = selModel.getSelections();
    var ids = new Array;
    for (var i = 0; i < sels.length; i++) {
        ids[i] = sels[i].get(idColumn);
    }
    return ids;
};